contents

프로세스 스케줄링은 운영체제(OS)의 핵심 기능으로, 특정 시점에 어떤 프로세스가 CPU를 사용할지 결정합니다. CPU가 하나인 시스템에서는 한 번에 하나의 프로세스만 실행할 수 있습니다. 스케줄러의 임무는 시스템이 반응성과 효율성을 유지하도록 이 시간 공유를 관리하는 것입니다.

비유하자면, CPU는 바쁜 주방의 헤드 셰프 1명이고, 프로세스들은 다양한 주문(애피타이저, 메인 요리, 디저트)입니다. 프로세스 스케줄러는 셰프가 다음으로 어떤 주문을 처리할지 순서를 정해주는 '작업 지시자(expediter)'와 같습니다.


프로세스 스케줄링의 목표

"최고의" 스케줄링 알고리즘은 달성하려는 목표에 따라 달라집니다. 주요 목표들은 종종 서로 상충 관계(trade-off)에 있습니다.


스케줄러의 종류

OS는 종종 함께 작동하는 세 가지 유형의 스케줄러를 가집니다.

  1. 장기 스케줄러 (작업 스케줄러): 디스크의 "작업 풀"에서 어떤 프로세스를 메모리의 준비 큐로 받아들일지 결정합니다. 드물게 실행되며 다중 프로그래밍 정도(메모리에 동시에 올라와 있는 프로세스의 수)를 제어합니다.
  2. 단기 스케줄러 (CPU 스케줄러): 대부분의 사람들이 "스케줄러"라고 부르는 것입니다. 매우 빈번하게 실행되며, 준비 큐에서 프로세스를 선택하여 CPU에 할당합니다.
  3. 중기 스케줄러 (스와퍼): 다중 프로그래밍 정도를 줄이고 메모리를 확보하기 위해 프로세스를 일시적으로 메모리에서 제거(디스크로 스와핑)하는 데 사용되기도 합니다.

선점형 vs. 비선점형

이는 스케줄링 전략 간의 가장 근본적인 구분입니다.


🧠 주요 스케줄링 알고리즘

단순한 것부터 복잡한 것까지, 가장 잘 알려진 스케줄링 알고리즘은 다음과 같습니다.

선입 선출 (First-Come, First-Served, FCFS)

가장 단순한 스케줄링 알고리즘입니다. 은행 창구의 줄처럼 프로세스가 단순한 큐에 배치됩니다.

최단 작업 우선 (Shortest Job First, SJF)

전체적인 처리량을 향상시키기 위해 "가장 빨리 끝날" 작업을 우선시하는 알고리즘입니다.

우선순위 스케줄링 (Priority Scheduling)

각 프로세스에 우선순위(정수)를 할당하고, 가장 높은 우선순위를 가진 프로세스에 CPU를 할당합니다.

라운드 로빈 (Round Robin, RR) ⏱️

고전적인 선점형 알고리즘이자 대부분의 현대 스케줄러의 기반입니다. 공정하고 응답성이 좋도록 설계되었습니다.


핵심 개념

문맥 교환 (Context Switch)

문맥 교환은 선점형 스케줄링을 가능하게 하는 메커니즘입니다. OS가 현재 실행 중인 프로세스의 상태를 저장하고, 다음 프로세스의 상태를 불러오는(load) 과정입니다.

여기에는 다음 정보 저장이 포함됩니다.

이 과정은 순수한 오버헤드입니다. 즉, 문맥 교환 중에는 유용한 작업이 수행되지 않습니다. 좋은 스케줄러는 뛰어난 응답성을 제공하면서도 문맥 교환을 최소화합니다.

현대 스케줄러

어떤 현대 OS도 이 단순한 알고리즘 중 하나만 사용하지 않습니다. 일반적으로 다단계 피드백 큐(Multilevel Feedback Queue, MLFQ) 와 같은 조합을 사용합니다. 이 시스템은 여러 개의 큐를 사용하며, 각 큐는 다른 우선순위와 알고리즘을 가집니다(예: 높은 우선순위 큐는 작은 퀀텀의 RR을, 낮은 우선순위 큐는 큰 퀀텀의 RR을 사용). 이를 통해 OS는 대화형 작업에 매우 빠르게 반응하면서도, 오래 실행되는 백그라운드 작업에도 CPU 시간을 할당할 수 있습니다.

references